﻿2026-06-15T11:09:20.1359523Z ##[group]Run ver="${GITHUB_REF_NAME#v}"   # v0.1.2 -> 0.1.2
2026-06-15T11:09:20.1359922Z [36;1mver="${GITHUB_REF_NAME#v}"   # v0.1.2 -> 0.1.2[0m
2026-06-15T11:09:20.1360204Z [36;1mnotes="dist/RELEASE_NOTES.md"[0m
2026-06-15T11:09:20.1360620Z [36;1m# Literal string matching (index, not regex) so the section header is[0m
2026-06-15T11:09:20.1361087Z [36;1m# matched identically across awk dialects — no bracket-escaping traps.[0m
2026-06-15T11:09:20.1361439Z [36;1mawk -v want="## [${ver}]" '[0m
2026-06-15T11:09:20.1361692Z [36;1m  index($0, want) == 1 { grab=1; next }[0m
2026-06-15T11:09:20.1361975Z [36;1m  grab && index($0, "## [") == 1 { exit }[0m
2026-06-15T11:09:20.1362259Z [36;1m  grab { print }[0m
2026-06-15T11:09:20.1362470Z [36;1m' CHANGELOG.md > "$notes"[0m
2026-06-15T11:09:20.1362738Z [36;1mif ! grep -q '[^[:space:]]' "$notes"; then[0m
2026-06-15T11:09:20.1363296Z [36;1m  echo "::error::CHANGELOG.md has no '## [$ver]' section — add the user-facing changelog for this release before tagging (see docs/RELEASE-RUNBOOK.md)."[0m
2026-06-15T11:09:20.1363869Z [36;1m  exit 1[0m
2026-06-15T11:09:20.1364058Z [36;1mfi[0m
2026-06-15T11:09:20.1364292Z [36;1mecho "----- release body for ${GITHUB_REF_NAME} -----"[0m
2026-06-15T11:09:20.1364584Z [36;1mcat "$notes"[0m
2026-06-15T11:09:20.1376738Z shell: /usr/bin/bash -e {0}
2026-06-15T11:09:20.1376977Z ##[endgroup]
2026-06-15T11:09:20.1427758Z ----- release body for v0.7.1 -----
2026-06-15T11:09:20.1433848Z 
2026-06-15T11:09:20.1434397Z A consistency-and-clarity patch: messages now arrive in one envelope across every channel, and `spt update apply` confirms success in plain language.
2026-06-15T11:09:20.1435451Z 
2026-06-15T11:09:20.1435581Z ### Changed
2026-06-15T11:09:20.1435733Z 
2026-06-15T11:09:20.1437417Z - **One message envelope across every channel.** Messages drained with `spt api poll` and `spt api worker-poll` now arrive in the same `<EVENT type="msg" from="…">…</EVENT>` envelope as the live `spt api listen` stream — one format to parse everywhere, and several queued messages are now self-delimiting. (Building an adapter? Parse the `<EVENT>` envelope on the poll channel; the older internal frame is gone.)
2026-06-15T11:09:20.1438812Z 
2026-06-15T11:09:20.1439016Z ### Fixed
2026-06-15T11:09:20.1439239Z 
2026-06-15T11:09:20.1440265Z - **`spt update apply` now confirms the update applied, in plain language.** A successful apply prints `Updated spt-core to vX.Y.Z.` with a link to the changelog, instead of the earlier provisional "trial" wording that left a finished update looking unresolved. (The changelog link now points at the canonical `github.com` address.)
2026-06-15T11:09:20.1441386Z 
